<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="Content-Style-Type" content="text/css" />
  <meta name="generator" content="pandoc" />
  <title></title>
  <style type="text/css">code{white-space: pre;}</style>
  <link rel="stylesheet" href="./doc/doc/markdown.css" type="text/css" />
</head>
<body>
<p><meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link href="markdown.css" rel="stylesheet"></link></p>
<h2 id="米盟广告-android-sdk-接入文档">米盟广告 Android SDK 接入文档</h2>
<h3 id="一sdk介绍">一，SDK介绍</h3>
<p>米盟广告SDK（Android）是由小米广告联盟官方推出，帮助开发者在安卓平台上轻松实现广告变现的软件工具包（以下简称SDK）,包含以下内容：JAR包，demo示例，javadoc文档,demo apk示例。以下使用<SDK_PATH>代表MiAdSdk.zip解压后的根目录:</p>
<ul>
<li>JAR包: <SDK_PATH>/libs/MimoSdk.jar，开发时导入工程中；</li>
<li>文档：<SDK_PATH>/Doc，包含SDK 接入说明和问题排查帮助等内容；</li>
<li>示例：<SDK_PATH>/demo，多个示例程序代码，帮你熟悉 SDK的使用方式；</li>
<li>示例APK: <SDK_PATH>/demo.apk,运行apk，可快速了解米盟sdk的广告样式，验证接入是否符合合格。</li>
</ul>
<p><strong>注意事项</strong> * 预置插件：预置插件可减少广告加载时间，方案详见<文档第2节> * SDK调试：本文档中提供了详尽的调试方案，详见<文档第10节></p>
<p>目前米盟广告SDK提供各种广告形式给客户端集成，SDK支持的广告形式包括：</p>
<ul>
<li>竖版开屏广告</li>
<li>横版开屏广告</li>
<li>竖版插屏广告</li>
<li>横版插屏广告</li>
<li>信息流广告</li>
<li>贴片广告</li>
<li>信息流视频广告</li>
<li>横幅广告</li>
<li>悬浮球广告</li>
<li>激励广告</li>
</ul>
<h3 id="二sdk接入说明">二，SDK接入说明</h3>
<p>1、 米盟广告sdk做了精简,仅包含一个jar包（位于libs目录下）:</p>
<ul>
<li>MimoSdk.jar : Sdk的jar包</li>
</ul>
<p>2、 申请应用App ID和广告位 ID 开发者需前往<a href="ssp.xiaomi.com">米盟SSP</a> ，注册开发者账户，并创建应用。相关帮助请见：<a href="https://dev.mi.com/console/doc/detail?pId=900">点击此处</a></p>
<p>3、 配置AndroidManifest.xml</p>
<p>小米SDK需要的权限列表:</p>
<pre><code>&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot;/&gt;
&lt;uses-permission android:name=&quot;android.permission.ACCESS_WIFI_STATE&quot;/&gt;
&lt;uses-permission android:name=&quot;android.permission.ACCESS_NETWORK_STATE&quot;/&gt;
&lt;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot;/&gt;
&lt;uses-permission android:name=&quot;android.permission.READ_EXTERNAL_STORAGE&quot;/&gt;
&lt;uses-permission android:name=&quot;android.permission.READ_PHONE_STATE&quot;/&gt;
&lt;uses-permission android:name=&quot;android.permission.GET_TASKS&quot;/&gt;
&lt;uses-permission android:name=&quot;android.permission.SYSTEM_ALERT_WINDOW&quot;/&gt;
&lt;uses-permission android:name=&quot;android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS&quot;/&gt;
&lt;uses-permission android:name=&quot;android.permission.DOWNLOAD_WITHOUT_NOTIFICATION&quot; /&gt;</code></pre>
<p>如果您的app目标sdk版本是23和以上,由于6.0版本以上的权限机制修改,那么请您在程序中显式申请权限,例子如下(需要v4包支持):</p>
<pre><code>// 如果api &gt;= 23 需要显式申请权限
if (Build.VERSION.SDK_INT &gt;= 23) {
    if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_PHONE_STATE}     , 0);
    }
}</code></pre>
<p>目前来说联盟sdk主要针对api 19以上做了适配,19以下可能会有问题,如果实在需要兼容19以下的版本并且发现的问题,请联系我们.</p>
<p>SDK需要的Activity声明:</p>
<pre><code>&lt;activity
    android:name=&quot;com.miui.zeus.mimo.sdk.activityProxy.ProxyActivity&quot;
    android:configChanges=&quot;keyboard|keyboardHidden|orientation|screenSize&quot;
    android:exported=&quot;false&quot;
    android:screenOrientation=&quot;behind&quot;
    android:theme=&quot;@android:style/Theme.Translucent.NoTitleBar.Fullscreen&quot;/&gt;&lt;/activity&gt;</code></pre>
<p>SDK需要的provider声明:</p>
<pre><code>&lt;provider
    android:name=&quot;android.support.v4.content.FileProvider&quot;
    android:authorities=&quot;${applicationId}.fileprovider&quot;
    android:exported=&quot;false&quot;
    android:grantUriPermissions=&quot;true&quot;&gt;;
    &lt;meta-data
        android:name=&quot;android.support.FILE_PROVIDER_PATHS&quot;
        android:resource=&quot;@xml/file_paths&quot; /&gt;
&lt;/provider&gt;</code></pre>
<p>声明后，需要在res文件夹下(也就是layout,drawable等文件夹所在的文件夹)，新建一个名叫file_paths.xml文件夹，写入以下内容:</p>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
    &lt;paths&gt;
    &lt;external-path path=&quot;mimoDownload&quot; name=&quot;files_root&quot; /&gt;
    &lt;external-path path=&quot;.&quot;     name=&quot;external_storage_root&quot; /&gt;
    &lt;/paths&gt;</code></pre>
<p>demo工程中也有演示例子，您可以参考。若您的项目中本身也需要用到fileProvider，可与上述的provider合并。合并时在file_paths.xml中加入您的文件路径即可。</p>
<p>4、 配置Proguard</p>
<p>开发者需要进行代码混淆，需要在配置里如下的keep项</p>
<pre><code>-keep class com.xiaomi.ad.**{*;}
-keep class com.miui.zeus.**{*;}</code></pre>
<p>5、 初始化AdSdk 在 Application onCreate 时候需要初始化 联盟sdk。 调用如下接口:</p>
<pre><code>MimoSdk.init(this, APP_ID, APP_KEY, APP_TOKEN);</code></pre>
<p>APP_ID请在开发者网站注册后获取。 APP_KEY和APP_TOKEN则直接传入&quot;fake_app_key&quot;,&quot;fake_app_token&quot;,传空会报错。</p>
<p>6、 预置插件 如需要在本地预置插件：1.请先添加“项目路径/assets”目录；2.在路径下添加mimo_asset.apk文件. 若无需在本地预置插件：不用添加上述目录和文件。 <strong>首次初始化会下载插件，插件下载成功才可以拉取到广告。预置插件可帮助开发者减少网络等待时间，开发者可根据自身情况选择合适方案</strong></p>
<p>7、自升级</p>
<p>一般来说开发者不需要关心自升级的功能，但是这里提供了2个接口方便开发者进行控制：</p>
<pre><code>// sdk是否已经准备完毕，建议在false的情况下停止相关调用
boolean MimoSdk.isSdkReady()

// 有些注重稳定性的开发者可能会想要关闭自升级，调用这个接口将会最大限度避免没必要的自升级
void setEnableUpdate(boolean enableUpdate)</code></pre>
<p>需要注意的是插件的下载可能与网络状态有关，当插件下载没有成功的时候调用广告接口会提示如下错误:</p>
<p>&quot;Plugin hasn't been ready, please wait&quot;</p>
<p>由于插件只要一次下载成功后续的广告请求将会很流畅，因此建议开发者在正式集成的时候，忽略掉这条信息．在调试的时候遇到这个提示请检查网络环境，或者用&quot;Plugin&quot;做筛选看提示的log何种错误，然后与我们联系.</p>
<p>8、 其他注意点 　　在发布之前请确定您关闭了debug模式和stage模式,例子如下</p>
<pre><code>//注释掉 MimoSdk.setDebugOn()
//注释掉 MimoSdk.setStageOn()</code></pre>
<h3 id="三eclipse适配">三，Eclipse适配</h3>
<p>如果你在Eclipse中进行开发，按照以下内容即可完成适配。SDK文档亦提供了适配Eclipse的demo. 1、将demo导入eclipse 直接在eclipse中通过import的方式直接导入demo即可。除了保留libs、res、src、AndroidManifest.xml以及project.properties外，其他路径与文件保留或删除均不会影响项目在eclipse下运行。</p>
<p>2、在manifest文件中的变更 其余均保持不变。eclipse由于引用不到gradle文件，需要将provider中的authorities由原先的${applicationId}改为如下：android:authorities=&quot;com.xiaomi.ad.mimo.demo.fileprovider&quot; （applicationId 替换为包名。当然如果原先就已包名开头的就不用改了）</p>
<p>3、包的引用 在项目中如果用到了android.support的包，需引入相关的jar。以android-support-v4为例。笔者在引入该包时碰到了一些函数必须在api&gt;=23才能引用。但是在android api&gt;=23的情况下android-support-v4不是单独的jar而是被封装成了aar。需对其进行解压（可以直接变更后缀为zip也可以linux下直接解压），然后将其中的classes.jar提取出来使用即可（改名或不改名其中的方法均可被引用到）。对于support.annotion包也是类似的处理。</p>
<p>如果是要引入android的support库要寻找对应版本的资源，可以在sdk manager中下载更新android support repository后，去<sdk安装路径>/extras/android下寻找对应版本的对应库，aar文件可以按之前一段所说处理，jar则可直接引用。</p>
<p>需要特殊说明的是网上有些指出在eclipse中，通过项目上右键→Android Tools→Add Support Library可完成上述一样的效果</p>
<p>其他jar包按照自己eclipse项目原先的结构引用就行。</p>
<p>4、可能遇到的问题 可能你本身安装了android studio，其有内置的sdk，但是引用该sdk可能导致如下提示： Failed to get the required ADT version number from the SDK. The Android Develop Toolkit may not work properly. 而且点击sdk manager其也不会正常运行。建议重新下载一个sdk来与android studio的sdk进行区分使用。</p>
<h3 id="四sdk接口说明">四，SDK接口说明</h3>
<p>准备工作: 无论是哪种广告类型,都遵循先获取IAdWorker,然后调用相应的显示接口 获取IAdWorker:</p>
<pre><code>AdWorkerFactory.getAdWorker(Context context, ViewGroup container, MimoAdListener listener, AdType type);
//context 一般是Activity context
//container 广告视图的容器
//listener 传入的监听器
//type 请求的广告类型


void loadAndShow(String upId) throws Exception;     //loadAndShow 加载并且显示广告

void load(String upId) throws Exception;            //load 单纯加载,一般用于插屏

void show() throws Exception;                       //show 单纯展示,一般在load成功以后调用

boolean isReady() throws Exception;                 //检查是否加载完成

void recycle() throws Exception;                    //回收资源</code></pre>
<p>对于视频类广告，为了提供对于视频的控制，接口略有不同</p>
<pre><code>AdWorkerFactory.getVideoAdWorker(Context context, String positionId, AdType type)</code></pre>
<p>接口和普通广告很接近，只是不需要在一开始传入listener,接下来看一下IVideoWorker的接口：</p>
<pre><code>int FLOW_VIDEO_UNKNOWN = 2;
/**
 * 视频开始播放
*/
int FLOW_VIDEO_START = 3;

/**
* 视频暂停
*/
int FLOW_VIDEO_PAUSE = 4;

/**
* 视频播放结束
*/
int FLOW_VIDEO_COMPLETE = 5;

// 加载视频资源，并不现实
void load() throws Exception;

// 在加载完成以后，在指定的容器显示视频
void show(ViewGroup container) throws Exception;

// 视频资源是否已经加载完成
boolean isReady() throws Exception;

// 播放/继续视频（耗时，不要放在主线程）
boolean play() throws Exception;

// 暂停视频
boolean pause() throws Exception;

// 回收资源，包括注册的监听
void recycle() throws Exception;

// 获取视频当前的状态
int getStatus();

// 设置视频监听
void setListener(MimoVideoListener listener);</code></pre>
<p>每个广告类型支持的接口略有差别,随意调用会抛出异常,这个需要开发者注意. <strong>需要注意的是，广告位与worker的关系强制为1:1,如果使用同一个广告位获得多个worker可能会有预料外的错误发生，包括但不限于回调不生效，计费失败。所以需要同时显示多个广告的开发者请申请对个广告位</strong> ###1、 开屏广告</p>
<p>开屏广告是在应用启动时启用，需嵌入在应用启动页的Activity中，广告展现5S后关闭。接入开屏广告前，需在SSP后台新建开屏广告位。 米盟广告有以下三种类型的开屏广告：</p>
<table>
<colgroup>
<col width="5%" />
<col width="48%" />
<col width="45%" />
</colgroup>
<thead>
<tr class="header">
<th align="left">类型</th>
<th align="left">说明</th>
<th align="left">注意</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td align="left">系统开屏</td>
<td align="left">无需接入SDK，只需在SSP后台启用即可有广告展现，价高质优，建议优先接入，详细说明请见：<a href="https://dev.mi.com/console/doc/detail?pId=902">点击此处</a></td>
<td align="left">每个应用都有默认的系统开屏广告位。系统开屏广告位不能用于SDK接入的广告位中</td>
</tr>
<tr class="even">
<td align="left">竖版开屏</td>
<td align="left">需通过SDK接入，可在非小米手机中展现开屏广告。</td>
<td align="left">勿使用系统开屏广告位，否则会报错</td>
</tr>
<tr class="odd">
<td align="left">横版开屏</td>
<td align="left">需通过SDK接入，可在非小米手机中展现开屏广告。</td>
<td align="left">勿使用系统开屏广告位，否则会报错</td>
</tr>
</tbody>
</table>
<p>以下为竖版/横版开屏接入的步骤： 请求广告接口:</p>
<pre><code>IAdworker myAdWorker = AdWorkerFactory.getAdWorker(context, container, listener, AdType.AD_SPLASH);
myAdWorker.loadAndShow(POSITION_ID);
//context　Activity context
//container　开屏ViewGroup，为一个全屏（match_parent）的ViewGroup
//listener　广告事件监听
//POSITION_ID　广告位ID

可参考:demo/AndroidManifest.xml的VerticalSplashAdActivity/HorizonSplashAdActivity部分，需要指定 Activity 的 android:screenOrientation 为 portrait（竖版开屏）或 landscape（横版开屏）并确认您的广告位是横版还是竖版，请见：demo/src/com/xiaomi/ad/demo/VerticalSplashAdActivity.java和HorizonSplashAdActivity.java

注意在配置了开屏的activity中配置android:configChanges=&quot;keyboard|keyboardHidden|orientation|screenSize</code></pre>
<p>开屏请求广告需要联网一段时间，在取广告期间，可以选择指定一张默认的全屏图，避免取开屏广告期间无内容展示，影响体验。可以参考 VerticalSplashAdActivity添加一张默认图片</p>
<p><em>请勿使用系统开屏广告位ID，否则将没有广告返回</em></p>
<h3 id="插屏广告">2、插屏广告</h3>
<p>横版/竖版插屏的请求代码基本一样。插屏类代码基本上属于弹窗类广告，所以我们需要的是当前获得焦点的activity或者其中的一个view.插屏不能被其他视图遮盖，以下为接入的步骤：</p>
<p>插屏广告初始化</p>
<pre><code>IAdworker myAdWorker = AdWorkerFactory.getAdWorker(context, (ViewGroup) getWindow().getDecorView(), listener, AdType.AD_INTERSTITIAL);
//context　请求广告的context
//插屏一般是不需要容器的,这里传入的是当前视图的一个锚点,推荐按照我们的写法写
//listener 广告事件监听</code></pre>
<p>插屏广告请求</p>
<pre><code>myAdWorker.load(POSITION_ID);//POSITION_ID: 广告位ID</code></pre>
<p>插屏广告显示 在广告监听中通知广告已经加载完成的时候可以调用</p>
<pre><code>myAdWorker.show()</code></pre>
<ul>
<li><p>插屏广告提供isReady()接口供开发者获取插屏广告准备情况，在准备完全可以调用show()显示插屏</p></li>
<li>我们会通过广告监听的onAdLoaded接口通知开发者广告已经准备完毕.</li>
<li><p>细节请见demo/src/com/xiaomi/ad/demo/VerticalInterstitialActivity和HorizonInterstitialActivity</p></li>
</ul>
<h3 id="标准信息流广告">3、 标准信息流广告</h3>
<p>建议渲染方式为宽确定/铺满,高度自适应，建议容器最小尺寸为：1080px*830px.</p>
<p>请求广告 IAdworker myAdWorker = AdWorkerFactory.getAdWorker(context, container, listener,AdType.AD_STANDARD_NEWSFEED); mAdWorker.recycle(); myAdWorker.load(POSITION_ID);//默认只拉取一条 //context 请求广告的context //container 广告视图的容器 //listener 广告监听 //POSITION_ID　广告位ID 展示广告 //获取第0个位置的广告，根据单次拉取的广告数量决定 container.addView(mAdWorker.updateAdView(null, 0)); 细节请参考demo/src/com/xiaomi/ad/demo/SingleNewsFeedActivity.java</p>
<h3 id="信息流广告list">4、 信息流广告List</h3>
<p>标准信息流广告的list化， 在listView中需要注意的是区分type,需要重写getViewTypeCount，getItemViewType两个关键方法．</p>
<p>请求广告 mWorker.load(POSITION_ID, size); //拉取size个广告，最多不超过10条 public void onAdLoaded(int size);//通过该回调可知晓成功返回几条广告</p>
<p>展示广告 mWorker.updateAdView(convertView, index); //展示第index个广告，开发者需要自己创建计数器，便于在list中控制广告展示 具体细节请参考 demo/src/com/xiaomi/ad/demo/NewsFeedListActivity.java</p>
<h3 id="贴片广告">5、贴片广告</h3>
<p>贴片广告是固定时长的视频或图片广告，展示在视频开始前或视频结束后。开发者可于米盟SSP后台中设置广告物料，默认无视频广告返回时会返回图片广告。 建议尺寸为宽确定/铺满,高度自适应,建议容器最小尺寸为：1280px*720px 需要注意展示以后是否立即播放，在demo中我们提供了VideoContainer做为例子，可调用相关接口控制播放，具体写法与插屏相似：</p>
<pre><code>IVideoAdWorker worker = AdWorkerFactory.getVideoAdWorker(this, PLASTER_POS_ID, AdType.AD_PLASTER_VIDEO);

worker.setListener(listener)

//context 请求广告的context
//container 广告视图的容器
//listener 广告监听
//POSITION_ID　广告位ID</code></pre>
<p>请参考demo/src/com/xiaomi/ad/demo/PlasterVideoActivity.java</p>
<h3 id="信息流视频list">6、信息流视频List</h3>
<p>信息流视频广告是展现在信息流中的视频广告。开发者可于米盟SSP后台中设置广告物料，默认无视频广告返回时会返回图片广告。</p>
<p>建议尺寸为宽确定/铺满,高度自适应,建议容器最小尺寸为：1080px*830px。 基本写法与信息流List很接近，要注意的是使用完要回收。开发者可先拉取物料，再根据时机展示广告。具体写法请参阅范例：</p>
<pre><code>demo/src/com/xiaomi/ad/demo/NewsFeedVideoListActivity.java</code></pre>
<h3 id="横幅">7、横幅</h3>
<p>竖版应用建议尺寸为宽确定/铺满,高度固定，建议高尺寸54dp. 横版应用接入横幅，需设置容器宽高，宽高尺寸：360dp*54dp，否则会影响用户体验。 尤其注意，横幅不能被视图遮盖，否则无法正常展示广告。 横幅被设计为全自动的设计，包括对请求失败的处理，开发者只需要简单接入，其他的事情都不需要处理，除了退出的时候必要的recycle 细节请参考demo/src/com/xiaomi/ad/demo/BannerActivity.java</p>
<h3 id="悬浮球">8、悬浮球</h3>
<p>悬浮球是类似于图标长时间显示与顶层的广告样式． 请求方式：</p>
<pre><code>IAdworker myAdWorker = AdWorkerFactory.getAdWorker(context, (ViewGroup) getWindow().getDecorView(), listener,AdType.AD_FLOAT_AD);
myAdWorker.loadAndShow(POSITION_ID);
//context 请求广告的context
//插屏一般是不需要容器的,这里传入的是当前视图的一个锚点,推荐按照我们的写法写
//listener 广告监听
//POSITION_ID　广告位ID

FloatAd.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
如上可设置悬浮球的初始显示位置</code></pre>
<p>细节请参考demo/src/com/xiaomi/ad/demo/FloatAdActivity.java</p>
<h3 id="激励广告">9、激励广告</h3>
<p>激励广告可使用于各种激励类的场景下，当用户下载并打开应用后，开发者收到回调，即可给用户提供奖励。 <strong>强调：接入时需要开发者指引用户，若用户不通过点击广告打开应用则无法获取奖励</strong></p>
<p>请求广告 mAdWorker.load(POSITION_ID); 广告回复 //　返回规定数量的激励广告 onAdLoaded(int num) 展示广告 // 展示第一条广告 container.addView(mWorker.updateAdView(null, 0)); 激励回调 //激励回调，当收到激励回调后，开发者可给予用户合适的奖励,应确保只发放1次 public void onStimulateSuccess() 细节请参考demo/src/com/xiaomi/ad/demo/StimulateAdActivity.java</p>
<h3 id="sdk调试">10、 SDK调试</h3>
<p>开发者接入SDK时，应用包可能还未上架应用商店，在接入的时候，建议使用demo中的测试广告位进行调试,保证接入方式无问题。 测试使用的APP_ID：2882303761517411490 | 广告类型 | 测试广告位ID | | ----- | -------------------------------- | | 横幅 | 802e356f1726f9ff39c69308bfd6f06a | | 横版插屏 | 1d576761b7701d436f5a9253e7cf9572 | | 竖版插屏 | 67b05e7cc9533510d4b8d9d4d78d0ae9 | | 横版开屏 | 94f4805a2d50ba6e853340f9035fda18 | | 竖版开屏 | b373ee903da0c6fc9c9da202df95a500 | | 信息流大图 | 2cae1a1f63f60185630f78a1d63923b0 | | 信息流小图 | 0c220d9bf7029e71461f247485696d07 | | 信息流组图 | b38f454156852941f3883c736c79e7e1 | | 信息流视频 | 0bd963002ece0fca0bfff800fb6beca5 | | 贴片广告 | 20c070adf42787a99f8146881a640306 | | 悬浮球广告 | a6fa00f86c8d849bd9eccade17e3eba5 | | 激励广告 | 6d089fcf31523ea73ca94138571ed31e |</p>
<p>如果接入能正常显示广告，则说明广告接入无问题。此时替换成自己的appid和广告位id，并关闭调试环境即可见到广告展现。 若按文档接入遇到问题，可查看本文档第12节的<strong>《常见接入问题》</strong>。</p>
<h3 id="错误码对照表">11、 错误码对照表</h3>
<table>
<thead>
<tr class="header">
<th align="left">code</th>
<th align="left">含义</th>
<th align="left">备注</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td align="left">300001</td>
<td align="left">广告位不存在</td>
<td align="left"></td>
</tr>
<tr class="even">
<td align="left">300002</td>
<td align="left">广告位在米盟SSP被暂停</td>
<td align="left">开发者关闭了广告位</td>
</tr>
<tr class="odd">
<td align="left">300003</td>
<td align="left">upId不存在</td>
<td align="left"></td>
</tr>
<tr class="even">
<td align="left">300004</td>
<td align="left">广告位被加入黑名单</td>
<td align="left">通常是因为有作弊嫌疑，请联系米盟解决</td>
</tr>
<tr class="odd">
<td align="left">300005</td>
<td align="left">应用在米盟SSP被暂停</td>
<td align="left">开发者暂停了应用下所有广告位</td>
</tr>
<tr class="even">
<td align="left">300006</td>
<td align="left">应用被加入黑名单</td>
<td align="left">通常是因为有作弊嫌疑，请联系米盟解决</td>
</tr>
<tr class="odd">
<td align="left">300007</td>
<td align="left">应用不存在</td>
<td align="left">确认广告位的应用信息是否正确</td>
</tr>
<tr class="even">
<td align="left">300009</td>
<td align="left">应用未上架</td>
<td align="left"></td>
</tr>
<tr class="odd">
<td align="left">100401</td>
<td align="left">被联盟投放限制过滤</td>
<td align="left">根据开发者在SSP后台设置的屏蔽策略屏蔽广告</td>
</tr>
<tr class="even">
<td align="left">100402</td>
<td align="left">请求包名与注册包名不一致</td>
<td align="left">请求包名与注册包名不一致将不返回广告</td>
</tr>
<tr class="odd">
<td align="left">101101</td>
<td align="left">广告位内部解析错误</td>
<td align="left">内部错误，请联系米盟解决</td>
</tr>
<tr class="even">
<td align="left">101102</td>
<td align="left">内部错误</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="odd">
<td align="left">101103</td>
<td align="left">内部错误</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="even">
<td align="left">101104</td>
<td align="left">内部错误</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="odd">
<td align="left">300215</td>
<td align="left">请联系米盟解决</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="even">
<td align="left">300216</td>
<td align="left">请联系米盟解决</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="odd">
<td align="left">300217</td>
<td align="left">请联系米盟解决</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="even">
<td align="left">300218</td>
<td align="left">请联系米盟解决</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="odd">
<td align="left">300220</td>
<td align="left">请联系米盟解决</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="even">
<td align="left">300221</td>
<td align="left">请联系米盟解决</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="odd">
<td align="left">300222</td>
<td align="left">请联系米盟解决</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="even">
<td align="left">300223</td>
<td align="left">请联系米盟解决</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="odd">
<td align="left">300224</td>
<td align="left">请联系米盟解决</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="even">
<td align="left">300225</td>
<td align="left">请联系米盟解决</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="odd">
<td align="left">300226</td>
<td align="left">请联系米盟解决</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="even">
<td align="left">300227</td>
<td align="left">请联系米盟解决</td>
<td align="left">请联系米盟解决</td>
</tr>
<tr class="odd">
<td align="left">300228</td>
<td align="left">请联系米盟解决</td>
<td align="left">请联系米盟解决</td>
</tr>
</tbody>
</table>
<h3 id="常见接入问题">12、 常见接入问题</h3>
<table>
<colgroup>
<col width="5%" />
<col width="47%" />
<col width="47%" />
</colgroup>
<thead>
<tr class="header">
<th align="left">类型</th>
<th align="left">问题</th>
<th align="left">解决方案</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td align="left">其他</td>
<td align="left">测试广告位在调试环境下能出广告，自己的广告位不能出广告</td>
<td align="left">关闭调试环境，如果应用已上架，则广告位将展示广告。</td>
</tr>
<tr class="even">
<td align="left">其他</td>
<td align="left">广告有返回，但不展示广告，也没有报错日志</td>
<td align="left">请联系米盟</td>
</tr>
<tr class="odd">
<td align="left">插屏</td>
<td align="left">插屏报错error_unknown</td>
<td align="left">1.请检查代码是否已经做了混淆；2.请检查是否已经按文档要求，放入JAR包</td>
</tr>
<tr class="even">
<td align="left">插屏</td>
<td align="left">插屏广告未显示，但是可点击</td>
<td align="left">检查插屏是否被遮盖，插屏广告视图需要置于最顶层。</td>
</tr>
<tr class="odd">
<td align="left">横幅</td>
<td align="left">自查接入无问题，但一直不展现横幅广告</td>
<td align="left">请检查横幅广告是否有被遮盖的情况，不能被视图遮盖。</td>
</tr>
<tr class="even">
<td align="left">异常</td>
<td align="left">verson code is 20026 ass is null</td>
<td align="left">无需关注的异常，该手机受用户体验保护不展示广告</td>
</tr>
<tr class="odd">
<td align="left">异常</td>
<td align="left">Failed to find provider info for com.miui.analytics.server.AnalyticsProvider</td>
<td align="left">请检查是否按文档要求，放入要求的jar包</td>
</tr>
<tr class="even">
<td align="left">异常</td>
<td align="left">Fatal Exception: java.lang.NoSuchMethodError: com.xiaomi.ad.internal.b.a.isAttachedToWindow</td>
<td align="left">安卓系统版本低，目前sdk支持API19(Android 4.4)以上的版本</td>
</tr>
<tr class="odd">
<td align="left">异常</td>
<td align="left">ERROR_INVALID_RESPONSE</td>
<td align="left">出现该问题，一般是因为使用错误广告位导致，可按以下方式排查：1.请检查是否使用了系统开屏广告位；2.如未使用系统开屏广告位，可放入demo代码中的测试广告位进行测试；3.没有按要求导入JAR包</td>
</tr>
<tr class="even">
<td align="left">异常</td>
<td align="left">onAdError</td>
<td align="left">请检查appid与up id是否正确</td>
</tr>
<tr class="odd">
<td align="left">异常</td>
<td align="left">fail_code：2,fail_msg:对应的app没有在配置系统中注册</td>
<td align="left">包名不一致导致，检测接入广告的包名是否与ssp网站注册的包名一致，包名一致才返回广告</td>
</tr>
<tr class="even">
<td align="left">异常</td>
<td align="left">java.lang.ClassNotFoundException:android.provider.MiuiSettings$Ad</td>
<td align="left">无需关注的异常，不影响广告展现与计费，在非MIUI系统上运行导致。</td>
</tr>
<tr class="odd">
<td align="left">异常</td>
<td align="left">ERROR_NO_AD</td>
<td align="left">该广告位没有广告返回，出现该问题有几种原因导致：1.处于调试环境，调试环境无广告，此时可关闭调试环境再看；2.广告位没有广告素材返回，可替换成测试广告位id</td>
</tr>
<tr class="even">
<td align="left">异常</td>
<td align="left">Plugin hasn't been loaded,please wait</td>
<td align="left">广告插件没有成功下载，下载完成后将正常展示。请在联网环境下下载插件， 插件下载成功后将不会重复下载</td>
</tr>
<tr class="odd">
<td align="left">异常</td>
<td align="left">接入后的广告展示形式与demo样例不同</td>
<td align="left">广告位类型错误导致，请检查后台建立的广告位是否准确</td>
</tr>
</tbody>
</table>
<p>如根据以上的解决方案仍未解决问题，可开启调试环境，获取报错日志。使用调试环境时，请使用测试广告位id和测试appid,以下为开启调试环境的方式 MimoSdk.setDebugOn(); // 打开调试，输出调试信息 MimoSdk.setStageOn(); // 打开测试请求开关，请求测试广告</p>
<p>上架前，需要注意关闭调试开关，否则无法正常计费：</p>
<pre><code>// MimoSdk.setDebugOn(); // 关闭调试
// MimoSdk.setStageOn(); // 关闭测试请求开关</code></pre>
<p><em>可将问题截图与报错日志等邮件至mi-ssp@xiaomi.com，会有专人进行处理。</em></p>
</body>
</html>
